import { Module } from '@nestjs/common';
import { FileController } from './file.controller';
import { FileService } from './file.service';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { MulterModule } from '@nestjs/platform-express';
import { diskStorage } from 'multer';
import { existsSync, mkdirSync } from 'fs';
import { extname, join } from 'path';

/**
 * 文件上传模块
 * 负责处理文件上传相关的配置和功能
 */
@Module({
  imports: [
    ConfigModule,
    // Multer模块配置，用于处理文件上传
    MulterModule.registerAsync({
      imports: [ConfigModule],
      useFactory: async (configService: ConfigService) => ({
        // 配置文件存储方式为磁盘存储
        storage: diskStorage({
          // 配置文件保存的目标目录
          destination: (req, file, cb) => {
            // 从配置服务获取上传目录，默认为'uploads'
            const uploadPath = join(process.cwd(), configService.get('UPLOAD_DIR', 'uploads'));
            // 如果目录不存在则创建
            if (!existsSync(uploadPath)) {
              mkdirSync(uploadPath, { recursive: true });
            }
            cb(null, uploadPath);
          },
          // 配置文件命名规则
          filename: (req, file, cb) => {
            // 处理文件名编码，确保支持中文等特殊字符
            const originalName = Buffer.from(file.originalname, 'latin1').toString('utf8');
            // 移除文件扩展名
            const nameWithoutExt = originalName.replace(/\.[^/.]+$/, '');
            // 生成时间戳
            const timestamp = Date.now();
            // 生成随机字符串
            const randomString = Math.round(Math.random() * 1e9).toString(36);
            // 获取原始文件扩展名
            const ext = extname(originalName);

            // 组合安全的文件名：原文件名-时间戳-随机字符串.扩展名
            const safeFileName = `${nameWithoutExt}-${timestamp}-${randomString}${ext}`;

            cb(null, safeFileName);
          },
        }),
        // 配置文件大小限制
        limits: {
          fileSize: parseInt(process.env.FILE_MAX_SIZE),
        },
        // 文件类型过滤器，当前接受所有类型
        fileFilter: (req, file, cb) => {
          cb(null, true);
        },
      }),
      // 注入配置服务
      inject: [ConfigService],
    }),
  ],
  // 注册文件控制器
  controllers: [FileController],
  // 注册文件服务
  providers: [FileService],
})
export class FileModule {}
